when is shift-reduce not bad?  When shift is the desired outcome
when is reduce-reduce not bad?  When both reductions reduce by the same production (actually common)
when is shift-$ not bad?  When shift is the desired outcome
when is reduce-$ not bad?  When both productions reduce by the same production

shift-reduce is very similar to shift-$, as it should be
reduce-$ is very similar to reduce-reduce, as it should be

reporting conflitcs with $ not necessary?  I think that it's fine
the way it is, since reductions with $ as lookahead only happen
after a shift, i.e. before the NEXT iteration.

Notes on negation of terminals.  Because negation of terminals is created
by ensuring that the goto of a negated symbol is the empty set, shift-reduce 
conflicts between a negated symbol and a reduction are not reported, and the
reduction goes ahead.  This is probably always the wanted behavior, however.
Also note that t(N) and ! t(N) are effectively treated as different terminals.
